package ui;

import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import servicios.GenericBusinessException;
import util.GuiUtilities;
import dominio.Producto;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import java.util.Vector;

public class UIProducto extends JFrame implements Observer{

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JLabel lblNombre = null;
	private JLabel lblCostoUnidad = null;
	private JTextField txtNombre = null;
	private JTextField txtCostoUnidad = null;
	private JScrollPane jScrollPane = null;
	private JTable jTable = null;
	private JButton btnNuevo = null;
	private JButton btnAgregar = null;
	private JButton btnBorrar = null;
	private JButton btnCancelar = null;
	private JButton btnBuscar = null;
	private DefaultTableModel tabModel = null;
	private JLabel lblOid = null;
	private JTextField txtOid = null;
	private JLabel lblPrecioVenta = null;
	private JLabel lblTiempoProduccion = null;
	private JTextField txtPrecioVenta = null;
	private JTextField txtTiempoProduccion = null;
	private ModeloPlanProduccion modeloPlanProduccion;

	/**
	 * This is the default constructor
	 * @param telefonista 
	 */
	public UIProducto(ModeloPlanProduccion modeloPlanProduccion) {
		super();
		this.modeloPlanProduccion=modeloPlanProduccion;
		modeloPlanProduccion.agregarObservador(this);
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(497, 452);
		this.setContentPane(getJContentPane());
		this.setTitle("Administracion Productos");
		actualizarLista();
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	public JPanel getJContentPane() {
		if (jContentPane == null) {
			lblTiempoProduccion = new JLabel();
			lblTiempoProduccion.setBounds(new Rectangle(13, 113, 112, 20));
			lblTiempoProduccion.setText("Tiempo Produccion");
			lblPrecioVenta = new JLabel();
			lblPrecioVenta.setBounds(new Rectangle(14, 85, 76, 22));
			lblPrecioVenta.setText("Precio Venta");
			lblOid = new JLabel();
			lblOid.setBounds(new Rectangle(12, 11, 78, 20));
			lblOid.setText("ID");
			lblCostoUnidad = new JLabel();
			lblCostoUnidad.setBounds(new Rectangle(12, 63, 78, 20));
			lblCostoUnidad.setText("Costo Unidad");
			lblNombre = new JLabel();
			lblNombre.setBounds(new Rectangle(12, 37, 78, 20));
			lblNombre.setText("Nombre");
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(lblNombre, null);
			jContentPane.add(lblCostoUnidad, null);
			jContentPane.add(getTxtNombre(), null);
			jContentPane.add(getTxtCostoUnidad(), null);
			jContentPane.add(getJScrollPane(), null);
			jContentPane.add(getBtnNuevo(), null);
			jContentPane.add(getBtnAgregar(), null);
			jContentPane.add(getBtnBorrar(), null);
			jContentPane.add(getBtnCancelar(), null);
			jContentPane.add(getBtnBuscar(), null);
			jContentPane.add(lblOid, null);
			jContentPane.add(getTxtOid(), null);
			jContentPane.add(lblPrecioVenta, null);
			jContentPane.add(lblTiempoProduccion, null);
			jContentPane.add(getTxtPrecioVenta(), null);
			jContentPane.add(getTxtTiempoProduccion(), null);
		}
		return jContentPane;
	}

	/**
	 * This method initializes txtNombre	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTxtNombre() {
		if (txtNombre == null) {
			txtNombre = new JTextField();
			txtNombre.setBounds(new Rectangle(130, 36, 103, 20));
		}
		return txtNombre;
	}

	/**
	 * This method initializes txtApellido	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTxtCostoUnidad() {
		if (txtCostoUnidad == null) {
			txtCostoUnidad = new JTextField();
			txtCostoUnidad.setBounds(new Rectangle(130, 61, 103, 20));
		}
		return txtCostoUnidad;
	}

	
	/**
	 * This method initializes jScrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane();
			jScrollPane.setBounds(new Rectangle(6, 155, 474, 263));
			jScrollPane.setViewportView(getJTable());
		}
		return jScrollPane;
	}

	/**
	 * This method initializes jTable	
	 * 	
	 * @return javax.swing.JTable	
	 */
	@SuppressWarnings("serial")
	private JTable getJTable() {
		if (jTable == null) {
			
			jTable = new JTable(getTabModel()){
				public boolean isCellEditable(int row, int column)
				{
					return false;
				}};
				jTable.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent e) {
						if (e.getClickCount() > 1) {
							getProductoSelected();
						}else{
							setProductoSelected();
						
						}
					}
				});
		}
		return jTable;
	}

	public void getProductoSelected() {
		int idProducto=Integer.parseInt(getJTable().getValueAt(getJTable().getSelectedRow(), 0).toString());
		if(idProducto!=0){
			Producto p;
			try {
				p = Fachada.buscarProducto(idProducto);

			if(p!=null){
				cargarProducto(p);
				dispose();
			}
			} catch (GenericBusinessException e1) {
				GuiUtilities.showError(this,e1.getMessage());
			}
		}
	}

	private void cargarProducto(Producto p) {
		txtCostoUnidad.setText(Double.toString(p.getCostoUnidad()));
		txtNombre.setText(p.getNombre());
		txtPrecioVenta.setText(Double.toString(p.getPrecioVenta()));
		txtTiempoProduccion.setText(Integer.toString(p.getTiempoProduccion()));
	}

	@SuppressWarnings("unchecked")
	protected void setProductoSelected() {
		int laRow=getJTable().getSelectedRow();
		txtOid.setText((Integer.toString((Integer)((Vector) getTabModel().getDataVector().elementAt(laRow)).elementAt(0))));
		txtNombre.setText((String)((Vector) getTabModel().getDataVector().elementAt(laRow)).elementAt(1));
		txtCostoUnidad.setText((Double.toString((Double)((Vector) getTabModel().getDataVector().elementAt(laRow)).elementAt(2))));
		txtPrecioVenta.setText((Double.toString((Double)((Vector) getTabModel().getDataVector().elementAt(laRow)).elementAt(3))));
		txtTiempoProduccion.setText((Integer.toString((Integer)((Vector) getTabModel().getDataVector().elementAt(laRow)).elementAt(4))));
	}

	public void selectCell(int row,int col){
         if(row!=-1 && col !=-1){
        	 getJTable().setRowSelectionInterval(row,row);
        	 getJTable().setColumnSelectionInterval(col,col);
          }
    }
	
	
	
	/**
	 * This method initializes btnNuevo	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnNuevo() {
		if (btnNuevo == null) {
			btnNuevo = new JButton();
			btnNuevo.setBounds(new Rectangle(335, 16, 139, 25));
			btnNuevo.setText("Nuevo");
			btnNuevo.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					nuevoProducto();
				}
			});
		}
		return btnNuevo;
	}

	protected void nuevoProducto() {
		borrarCampos();
		txtOid.setText("");
	}

	private void borrarCampos() {
		txtNombre.setText("");
		txtCostoUnidad.setText("");
		txtPrecioVenta.setText("");
		txtTiempoProduccion.setText("");
	}

	/**
	 * This method initializes btnAgregar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnAgregar() {
		if (btnAgregar == null) {
			btnAgregar = new JButton();
			btnAgregar.setBounds(new Rectangle(335, 50, 139, 25));
			btnAgregar.setText("Agregar/Modificar");
			btnAgregar.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					guardar();
				}
			});
		}
		return btnAgregar;
	}

	protected void guardar() {
		if(validoCampos()){
		Producto unProducto=new Producto();
		if(!txtOid.getText().equals("")){
			unProducto.setId(Integer.parseInt(txtOid.getText()));	
		}else{
			unProducto.setId(0);
		}
		unProducto.setCostoUnidad(Double.parseDouble(txtCostoUnidad.getText()));
		unProducto.setPrecioVenta(Double.parseDouble(txtPrecioVenta.getText()));
		unProducto.setNombre(txtNombre.getText());
		unProducto.setTiempoProduccion(Integer.parseInt(txtTiempoProduccion.getText()));
		
		try {
			Fachada.guardarProducto(unProducto);
		} catch (Exception e) {
			GuiUtilities.showError(this,e.getMessage());
		}
		txtOid.setText("");
		borrarCampos();
		actualizarLista();
		modeloPlanProduccion.hasChanged();
		}
	}


	private boolean validoCampos() {
		try{
			if(txtNombre.getText().equals("")){
				GuiUtilities.showError(this,"El nombre no puede ser Vacio");
				return false;
			}else{
				if(!(Double.parseDouble(txtCostoUnidad.getText())>0)||!(Double.parseDouble(txtPrecioVenta.getText())>0)){
					GuiUtilities.showError(this,"Costo y Precio venta deben ser mas que 0");
					return false;
				}else if(Double.parseDouble(txtCostoUnidad.getText())>Double.parseDouble(txtPrecioVenta.getText())){
					GuiUtilities.showError(this,"Precio de venta debe ser superior al costo");
					return false;
					
				}else{
					if(!(Integer.parseInt(txtTiempoProduccion.getText())>0)){
						GuiUtilities.showError(this,"Tiempo Produccion deb ser superior a 0");
						return false;
					}else{
						return true;
					}
				}
			}
		}catch(NumberFormatException e){
			GuiUtilities.showError(this,e.getMessage());
			return false;
		}
	}

	@SuppressWarnings("unchecked")
	private void actualizarLista() {
		getJTable().removeAll();
		List resultado = new ArrayList();
		try {
			resultado=Fachada.getListaProductos();
		} catch (Exception e) {
			GuiUtilities.showError(this,e.getMessage());
		}
		if(!resultado.isEmpty()){
			Vector<String> columns=new Vector<String>();
			String[] columnnames={ 
					"Id","Nombre","Costo Unidad","Precio Venta","Tiempo Produccion"
			};
			for(int i=0;i<columnnames.length;i++)
				columns.addElement((String) columnnames[i]);
			tabModel.setRowCount(resultado.size());
			Vector lasRows=new Vector();
			for(int x=0;x<resultado.size();x++){
				Vector unaRow=new Vector();
				Producto unProducto=(Producto)resultado.get(x);
				unaRow.add(unProducto.getId());
				unaRow.add(unProducto.getNombre());
				unaRow.add(unProducto.getCostoUnidad());
				unaRow.add(unProducto.getPrecioVenta());
				unaRow.add(unProducto.getTiempoProduccion());
				lasRows.add(unaRow);
			}
			tabModel.setDataVector(lasRows, columns);
		}else{
			tabModel.setRowCount(0);
		}
	}

	

	/**
	 * This method initializes btnBorrar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnBorrar() {
		if (btnBorrar == null) {
			btnBorrar = new JButton();
			btnBorrar.setBounds(new Rectangle(335, 84, 139, 25));
			btnBorrar.setText("Borrar");
			btnBorrar.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					borrarSelected();
				}
			});
		}
		return btnBorrar;
	}

	protected void borrarSelected() {
		if(!txtOid.getText().equals("")){
			Producto unProducto=new Producto();
			unProducto.setId(Integer.parseInt(txtOid.getText()));
			try {
				if(Fachada.productoEnPedido(unProducto.getId())){
					GuiUtilities.showError(this,"No se puede eliminar un producto que esta en un Pedido");
				}else{
				Fachada.eliminar(unProducto);
				borrarCampos();
				txtOid.setText("");
				actualizarLista();
				modeloPlanProduccion.hasChanged();
				//actualizarLista();
				}
			} catch (Exception e) {
				GuiUtilities.showError(this,e.getMessage());
			}
			
		}
	}

	/**
	 * This method initializes btnCancelar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnCancelar() {
		if (btnCancelar == null) {
			btnCancelar = new JButton();
			btnCancelar.setBounds(new Rectangle(335, 118, 139, 25));
			btnCancelar.setText("Cancelar");
			btnCancelar.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					UIProducto.this.dispose();
				}
			});
		}
		return btnCancelar;
	}

	private DefaultTableModel getTabModel(){
		if(tabModel==null){
		tabModel=new DefaultTableModel();
		Vector<String> rows = new Vector<String>();
		Vector<String> columns=new Vector<String>();
		String[] columnnames={"Id","Nombre","Costo Unidad","Precio Venta","Tiempo Produccion"}; 
		for(int i=0;i<columnnames.length;i++)
			columns.addElement((String) columnnames[i]);
		tabModel.setDataVector(rows,columns);
		return tabModel;
		}else{
			return tabModel;
		}
		
	}
	
	
	
	/**
	 * This method initializes btnBuscar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnBuscar() {
		if (btnBuscar == null) {
			btnBuscar = new JButton();
			btnBuscar.setBounds(new Rectangle(249, 35, 75, 21));
			btnBuscar.setText("Buscar");
			btnBuscar.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					buscarDatosXNombre();
				}
			});
		}
		return btnBuscar;
	}
	
	@SuppressWarnings("unchecked")
	protected void buscarDatosXNombre() {
		List<Producto> resultado = new ArrayList<Producto>();
		try {
			resultado=Fachada.buscarProductoXNombre(txtNombre.getText());
		} catch (GenericBusinessException e1) {
			GuiUtilities.showError(this,e1.getMessage());
		}
		if(!resultado.isEmpty()){
			if(resultado.size()==1){
				Producto unProducto=(Producto)resultado.get(0);
				txtOid.setText(Integer.toString(unProducto.getId()));
				txtNombre.setText(unProducto.getNombre());
				txtCostoUnidad.setText(Double.toString(unProducto.getCostoUnidad()));
				txtTiempoProduccion.setText(Integer.toString(unProducto.getTiempoProduccion()));
				txtPrecioVenta.setText(Double.toString(unProducto.getPrecioVenta()));
			}else{
				Vector<String> columns=new Vector<String>();
				String[] columnnames={"Id","Nombre","Costo Unidad","Precio Venta","Tiempo Produccion"};
				for(int i=0;i<columnnames.length;i++)
					columns.addElement((String) columnnames[i]);
				tabModel.setRowCount(resultado.size());
				Vector lasRows=new Vector();
				for(int x=0;x<resultado.size();x++){
					Vector unaRow=new Vector();
					Producto unProducto=(Producto)resultado.get(x);
					unaRow.add(unProducto.getId());
					unaRow.add(unProducto.getNombre());
					unaRow.add(unProducto.getCostoUnidad());
					unaRow.add(unProducto.getPrecioVenta());
					unaRow.add(unProducto.getTiempoProduccion());
					lasRows.add(unaRow);
				}
				tabModel.setDataVector(lasRows, columns);
			}
		}
	}

	/**
	 * This method initializes txtOid	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTxtOid() {
		if (txtOid == null) {
			txtOid = new JTextField();
			txtOid.setBounds(new Rectangle(130, 11, 103, 20));
			txtOid.setEditable(false);
		}
		return txtOid;
	}

	/**
	 * This method initializes txtPrecioVenta	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTxtPrecioVenta() {
		if (txtPrecioVenta == null) {
			txtPrecioVenta = new JTextField();
			txtPrecioVenta.setBounds(new Rectangle(130, 86, 103, 20));
		}
		return txtPrecioVenta;
	}

	/**
	 * This method initializes txtTiempoProduccion	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTxtTiempoProduccion() {
		if (txtTiempoProduccion == null) {
			txtTiempoProduccion = new JTextField();
			txtTiempoProduccion.setBounds(new Rectangle(130, 111, 103, 20));
			txtTiempoProduccion.setEditable(true);
		}
		return txtTiempoProduccion;
	}

	@Override
	public void update(Observable o, Object arg) {
		// TODO Auto-generated method stub
		
	}

	
	
	

}  //  @jve:decl-index=0:visual-constraint="10,10"